package com.jeesite.modules.wzt.service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.hutool.core.date.DateUtil;
import com.banboocloud.Codec.Sm4Cipher;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.entity.Extend;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.modules.sys.entity.Employee;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.service.EmployeeService;
import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.wzt.entity.WztOrg;
import com.jeesite.modules.wzt.util.BamboocloudUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jeesite.common.entity.Page;
import com.jeesite.common.service.CrudService;
import com.jeesite.modules.wzt.entity.WztUser;
import com.jeesite.modules.wzt.dao.WztUserDao;

/**
 * wzt_userService
 * @author xhc
 * @version 2023-03-15
 */
@Service
@Transactional(readOnly=false)
public class WztUserService extends CrudService<WztUserDao, WztUser> {
	@Autowired
	private UserService userService;
	@Autowired
	private EmployeeService employeeService;
	@Autowired
	private WztOrgService wztOrgService;
	String key = "JLB6L6MJVIT5Z7IL";
	/**
	 * 获取单条数据
	 * @param wztUser
	 * @return
	 */
	@Override
	public WztUser get(WztUser wztUser) {
		return super.get(wztUser);
	}
	
	/**
	 * 查询分页数据
	 * @param wztUser 查询条件
	 * @return
	 */
	@Override
	public Page<WztUser> findPage(WztUser wztUser) {
		return super.findPage(wztUser);
	}
	
	/**
	 * 查询列表数据
	 * @param wztUser
	 * @return
	 */
	@Override
	public List<WztUser> findList(WztUser wztUser) {
		return super.findList(wztUser);
	}
	
	/**
	 * 保存数据（插入或更新）
	 * @param wztUser
	 */
	@Override
	@Transactional(readOnly=false)
	public void save(WztUser wztUser) {
		super.save(wztUser);
	}
	
	/**
	 * 更新状态
	 * @param wztUser
	 */
	@Override
	@Transactional(readOnly=false)
	public void updateStatus(WztUser wztUser) {
		super.updateStatus(wztUser);
	}
	
	/**
	 * 删除数据
	 * @param wztUser
	 */
	@Override
	@Transactional(readOnly=false)
	public void delete(WztUser wztUser) {
		super.delete(wztUser);
	}

	public Map findWztList(Map empUserMap) {
		List wztList = dao.findWztList(empUserMap);
		if(ListUtils.isNotEmpty(wztList)){
			return (Map) wztList.get(0);
		}
		return null;
	}
	@Transactional(rollbackFor = Exception.class)
	public  Map<String,Object> createUser(Map<String, Object> reqmap)  {
		Map<String,Object> resMap = new HashMap<>();
		WztUser wztUser = new WztUser();
		try {
			BamboocloudUtils.copyProperties(reqmap,wztUser);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//校验必传人员属性字段
		if (checkCreateUser(resMap, wztUser)) return resMap;
		WztUser new_user = get(wztUser);
		if(new_user!=null){
			resMap.put("resultCode","500");
			resMap.put("message","创建失败用户已经存在");
			return resMap;
		}
		/**皖政通创建新账号开始逻辑**/
		//通过手机号查询我们系统用户
		User user_db = dao.querySysUserbyMoblie(wztUser.getMobile(),wztUser.getFullname());
		wztUser.setSysUid(user_db == null?IdGen.nextId():user_db.getUserCode());
		wztUser.setUserStatus("0");
		wztUser.setCreatetime(DateUtil.formatDate(new Date()));
		resMap.put("uid",wztUser.getSysUid());
		/**皖政通创建新账号结束**/
		//创建系统user,employee
		User user = new User();
		user.setUserCode(wztUser.getSysUid());
		// 用户登录id
		user.setLoginCode(wztUser.getMobile());
		// 用户名称
		user.setUserName(wztUser.getFullname());
		// 用户类型引用编号、名称
		user.setRefCode(wztUser.getSysUid());
		user.setRefName(wztUser.getFullname());
		// 手机号
		user.setMobile(wztUser.getMobile());
		// 性别
		//user.setSex(wztUser.getGender());
		// 插入用户机构
		Employee employee = new Employee();
		Office office = new Office();
		// 用户机构id
		WztOrg org = wztOrgService.queryOfficeByWztOrgTable(wztUser.getOrganizitionId());
		if(org == null){
			resMap.put("resultCode","500");
			resMap.put("message","创建用户失败机构不在，请联系管理员先创建机构");
			return resMap;
		}
		office.setOfficeCode(org.getOfficeCode());
		office.setOfficeName(StringUtils.isBlank(org.getOfficeName())?"测试新增机构":org.getOfficeName());
		// 用户编号
		employee.setEmpCode(wztUser.getSysUid());
		// 用户名称
		employee.setEmpName(wztUser.getFullname());
		employee.setOffice(office);
		employee.setStatus("0");
		//扩展字段
		Extend extend=new Extend();
		//皖政通主键
		extend.setExtendS3(wztUser.getUserid());
		user.setExtend(extend);
		// 用户类型
		user.setUserType("employee");
		// 用户状态
		user.setStatus("0");
		// 管理员类型
		user.setMgrType("0");
		// 用户密码，初始密码
		user.setPassword(StringUtils.isBlank(wztUser.getPassword())?"Lehand159":wztUser.getPassword());
		// 创建人
		user.setCreateBy("system");
		user.setCreateDate(new Date());
		//备注
		//新增用户
		encryptNameMobile(wztUser);
		dao.insert(wztUser);
		if(user_db==null){
			userService.insert(user);
			//用户关联和用户对应组织
			employeeService.insert(employee);
		}else {
//			userService.update(user);
//			employeeService.update(employee);
			dao.updateUserExtentS3(wztUser);
		}
		//重置密码
		userService.updatePassword(user.getUserCode(), user.getPassword());
		return resMap;

	}

	private void encryptNameMobile(WztUser wztUser) {
		Sm4Cipher sm4Cipher = new Sm4Cipher();
	//	String fullName = sm4Cipher.encrypt(wztUser.getFullname(), key);
		String mobile = sm4Cipher.encrypt(wztUser.getMobile(), key);
		//wztUser.setFullname(fullName);
		wztUser.setMobile(mobile);
	}

	private boolean checkCreateUser(Map<String, Object> resMap, WztUser wztUser) {
		if(StringUtils.isBlank(wztUser.getUsername())){
			resMap.put("resultCode","500");
			resMap.put("message","登录用户名必传");
			return true;
		}
		if(StringUtils.isBlank(wztUser.getUserid())){
			resMap.put("resultCode","500");
			resMap.put("message","用户 id必传");
			return true;
		}
		if(StringUtils.isBlank(wztUser.getMobile())){
			resMap.put("resultCode","500");
			resMap.put("message","手机号必传");
			return true;
		}
		if(StringUtils.isBlank(wztUser.getFullname())){
			resMap.put("resultCode","500");
			resMap.put("message","姓名必传");
			return true;
		}
		if(StringUtils.isBlank(wztUser.getOrganizitionId())){
			resMap.put("resultCode","500");
			resMap.put("message","所在机构必传");
			return true;
		}

		if(StringUtils.isBlank(wztUser.getRelation())){
			resMap.put("resultCode","500");
			resMap.put("message","任职属性必传");
			return true;
		}
		return false;
	}

	@Transactional(rollbackFor = Exception.class)
	public Map<String, Object> updateuser(Map<String, Object> reqmap) throws Exception {
		Map<String,Object> resMap = new HashMap<>();
		WztUser wztUser = new WztUser();
		try {
			BamboocloudUtils.copyProperties(reqmap,wztUser);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if(reqmap.get("bimUid")==null){
			resMap.put("resultCode","500");
			resMap.put("message","bimUid必传");
			return resMap;
		}
		wztUser.setSysUid(reqmap.get("bimUid").toString());
		User bimUid = userService.get(reqmap.get("bimUid").toString());
		if(bimUid==null){
			resMap.put("resultCode","500");
			resMap.put("message","此bimUid不存在");
			return resMap;
		}
		wztUser.setUserid(bimUid.getExtend().getExtendS3());
		WztUser wztUser_db = dao.get(wztUser);
		wztUser.setUserid(wztUser_db.getUserid());
		if(reqmap.get("__ENABLE__")!=null) {
			boolean status = (boolean)reqmap.get("__ENABLE__");
			if(status){
				wztUser.setUserStatus("0");
			}else {
				wztUser.setUserStatus("2");
			}
			if(dao.updateUserStatus(wztUser.getSysUid(),wztUser.getUserStatus())+dao.updateEmployeeStatus(wztUser.getSysUid(),wztUser.getUserStatus())!=2){
				throw new Exception("更新用户状态失败");
			}
		}
		wztUser.setUpdatetime(DateUtil.formatDate(new Date()));

		//创建系统user,employee
		User user = new User();
		user.setUserCode(wztUser.getSysUid());
		// 用户登录id
		user.setLoginCode(wztUser.getMobile());
		// 用户名称
		user.setUserName(wztUser.getFullname());
		// 用户类型引用编号、名称
		user.setRefCode(wztUser.getSysUid());
		user.setRefName(wztUser.getFullname());
		// 手机号
		user.setMobile(wztUser.getMobile());
		// 性别
		user.setSex(wztUser.getGender());
		// 插入用户机构
		Employee employee = new Employee();
		Office office = new Office();
		// 用户机构id
		if(StringUtils.isNotBlank(wztUser_db.getOrganizitionId())){
			WztOrg org = wztOrgService.queryOfficeByWztOrgTable(wztUser_db.getOrganizitionId());
			if (org == null) {
				resMap.put("resultCode", "500");
				resMap.put("message", "更新失败对应组织不在，请联系管理员");
				return resMap;
			}
			office.setOfficeCode(org.getOfficeCode());
			office.setOfficeName(org.getOfficeName());
		}

		// 用户编号
		// 用户编号
		employee.setEmpCode(wztUser.getSysUid());
		// 用户名称
		employee.setEmpName(wztUser.getFullname());
		employee.setOffice(office);
		employee.setStatus(wztUser.getUserStatus());
		// 用户类型
		// 用户状态
		user.setStatus(wztUser.getUserStatus());
		encryptNameMobile(wztUser);
		dao.update(wztUser);
		userService.update(user);
		employeeService.update(employee);
		return resMap;
	}
	@Transactional(rollbackFor = Exception.class)
	public Map<String, Object> deleteUser(Map<String, Object> reqmap) throws Exception {
		Map<String,Object> resMap = new HashMap<>();
		WztUser wztUser = new WztUser();
		if(reqmap.get("bimUid")==null){
			resMap.put("resultCode","500");
			resMap.put("message","bimUid必传");
			return resMap;
		}
		wztUser.setSysUid(reqmap.get("bimUid").toString());
		User user = new User();
		user.setUserCode(wztUser.getSysUid());
		WztUser wztUser_db = dao.queryBySysId(wztUser.getSysUid());
		if(wztUser_db == null){
			resMap.put("resultCode","500");
			resMap.put("message","删除失败不存在此用户");
			return resMap;
		}
		if(dao.delete(wztUser_db)+dao.deleteUser(user)+dao.deleteEmployee(user)!=3){
			throw new Exception("删除用户失败");
		}
		return resMap;
	}
}